﻿namespace Uhimania.Libraries.Windows.Interactivity
{
    #region BehaviorCollection
    /// <summary>
    /// 共有される <see cref="IAttachedObject.AssociatedObject"/> とともに
    /// <see cref="Behavior"/> のコレクションを表し、
    /// <see cref="IAttachedObject.AssociatedObject"/> に変更が発生すると
    /// 変更通知をコンテンツに提供する。
    /// </summary>
    public class BehaviorCollection : AttachableCollection<Behavior>
    {
        #region OnAttached
        /// <summary>
        /// コレクションが <see cref="IAttachedObject.AssociatedObject"/> に
        /// アタッチされた直後に呼び出される。
        /// </summary>
        protected override void OnAttached()
        {
            foreach (var item in this)
                item.Attach(this.AssociatedObject);
        }
        #endregion

        #region OnDetaching
        /// <summary>
        /// コレクションが <see cref="IAttachedObject.AssociatedObject"/> から
        /// デタッチされるとき、その前に呼び出される。
        /// </summary>
        protected override void OnDetaching()
        {
            foreach (var item in this)
                item.Detach();
        }
        #endregion

        #region ItemAdded
        /// <summary>
        /// コレクションにアイテムが追加されたときに呼び出される。
        /// </summary>
        /// <param name="item">追加されたアイテム。</param>
        protected override void ItemAdded(Behavior item)
        {
            if (this.AssociatedObject != null)
                item.Attach(this.AssociatedObject);
        }
        #endregion

        #region ItemRemoved
        /// <summary>
        /// コレクションからアイテムが削除されたときに呼び出される。
        /// </summary>
        /// <param name="item">削除されたアイテム。</param>
        protected override void ItemRemoved(Behavior item)
        {
            if (item.AssociatedObject != null)
                item.Detach();
        }
        #endregion
    }
    #endregion
}
